package com.nondo.rdp.auth.service.impl;

import com.nondo.rdp.auth.domain.Role;
import com.nondo.rdp.auth.domain.User;
import org.apache.commons.lang3.StringUtils;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;

/**
 * com.seelyn.superp.core.service.impl
 *
 * @author linfeng
 * @since 2017/7/30
 */
public class BaseService<T> {


    /**
     * 数据范围过滤
     *
     * @param user        当前用户对象，通过“UserUtils.getUser()”获取
     * @param officeAlias 机构表别名，例如：dc.createAlias("office", "office");
     * @param userAlias   用户表别名，传递空，忽略此参数
     * @return 标准连接条件对象
     */
    protected Predicate dataScopeFilter(User user, String officeAlias, String userAlias, Root<T> root, CriteriaBuilder builder) {

//        List<Predicate> predicates = new ArrayList<>();
//        Predicate predicate = builder.conjunction();
//        // 进行权限过滤，多个角色权限范围之间为或者关系。
//        List<String> dataScope = new ArrayList<>();
//        // 超级管理员，跳过权限过滤
//        if (!user.isAdmin()) {
//            for (Role role : user.getRoleList()) {
//                if (!dataScope.contains(role.getDataScope()) && StringUtils.isNotBlank(officeAlias)) {
//                    boolean isDataScopeAll = false;
////                    if (Role.DATA_SCOPE_ALL.equals(role.getDataScope())) {
////                        isDataScopeAll = true;
////                    } else if (Role.DATA_SCOPE_COMPANY_AND_CHILD.equals(role.getDataScope())) {
////
////                        predicates.add(builder.equal(root.get(officeAlias).get("id"), user.getCompany().getId()));
////                        predicates.add(builder.like(root.get(officeAlias).get("parentIds"), user.getCompany().getParentIds() + user.getCompany().getId() + ",%"));
////
////                    } else if (Role.DATA_SCOPE_COMPANY.equals(role.getDataScope())) {
////
////                        predicates.add(builder.equal(root.get(officeAlias).get("id"), user.getCompany().getId()));
////                        predicates.add(builder.equal(root.get(officeAlias).get("parent").get("id"), user.getCompany().getId()));
////                        predicates.add(builder.equal(root.get(officeAlias).get("type"), "2"));
////
////                    } else if (Role.DATA_SCOPE_OFFICE_AND_CHILD.equals(role.getDataScope())) {
////
////                        predicates.add(builder.equal(root.get(officeAlias).get("id"), user.getOffice().getId()));
////                        predicates.add(builder.like(root.get(officeAlias).get("parentIds"), user.getOffice().getParentIds() + user.getOffice().getId() + ",%"));
////
////                    } else if (Role.DATA_SCOPE_OFFICE.equals(role.getDataScope())) {
////
////                        predicates.add(builder.equal(root.get(officeAlias).get("id"), user.getOffice().getId()));
////
////                    } else if (Role.DATA_SCOPE_CUSTOM.equals(role.getDataScope())) {
////
////                        CriteriaBuilder.In<Long> in = builder.in(root.get(officeAlias).get("id"));
////                        for (Long officeId : role.getOfficeIdList()) {
////                            in.value(officeId);
////                        }
////                        predicates.add(in);
////
////                    }
//                    if (!isDataScopeAll) {
//                        if (StringUtils.isNotBlank(userAlias)) {
//
//                            predicates.add(builder.equal(root.get(userAlias).get("id"), user.getId()));
//                        } else {
//                            predicates.add(builder.isNull(root.get(officeAlias).get("id")));
//                        }
//                    } else {
//                        // 如果包含全部权限，则去掉之前添加的所有条件，并跳出循环。
//                        predicate = builder.disjunction();
//                        break;
//                    }
//                    dataScope.add(role.getDataScope());
//                }
//                Predicate[] predicatesArray = new Predicate[predicates.size()];
//                predicates.toArray(predicatesArray);
//                predicate = builder.and(predicatesArray);
//            }
//        }
//        return predicate;
        return null;
    }

}
